package cn.agiledata.bank.common.util;

import java.io.UnsupportedEncodingException;
import java.util.Map;

import org.apache.commons.lang.StringUtils;



/**
 * 3DES 算法
 * @author mxb
 *
 */
public class DesUtils {
	
	 public static Map<String, Object> doFilter(String actionInfo, String mainKey)
		throws Exception {
			if (StringUtils.isBlank(actionInfo) || actionInfo.trim().length() < 32) {
				return null;
			}
			
			// 获取随机数
			String randData = actionInfo.substring(0, 32);
			// 获取应用密文
			String singData = actionInfo.substring(32, actionInfo.length());
			// 获取过程密钥
			String processKey = SecurityUtil.desecb(mainKey, randData,
					0);
			// 解密singData
			String actionInfoString = SecurityUtil.desecb(processKey, singData, 1);
			// 将16进制数字解码成字符串,适用于所有字符（包括中文）
			actionInfoString = SecurityUtil.hexStringToString(actionInfoString);
			// 最后一个'80'出现的位置
			int num = actionInfoString.lastIndexOf("80");
			// 截取actionInfoString
			if (num != -1) {
				actionInfoString = actionInfoString.substring(0, num);
			}
			// actionInfoString转换为字符串
			actionInfoString = new String(StringUtil.hexToBytes(actionInfoString),
					"UTF-8");
			
			// 生成actionInfoMap
			Map<String, Object> actionInfoMap = JSONUtil.getInstance()
					.parseJSON2Map(actionInfoString);
			
			return actionInfoMap;
		}
	    
	    /**
	     * 实现思路：保存连续的正数,记录开始的位置,循环直到遇到负数。
	     * 算出这个值,与之前保存的值比较。
	     * 如果这个值大于之前保存的值,则保留。否则过滤
	     * 如果全是负数,则找到最小的负数
	     * @param Array
	     * @return
	     */
	    public static int[] search(int[] Array){    	
	    	// 返回的数组
	    	int[] returnArray = null;
	    	// 定义第一个正数所在位置
	    	int posIndex = 0;
	    	// 连续正数的范围
	    	int range = 0;
	    	// 定义一个标识位,标识是否更新第一个正数所在位置
	    	boolean isPosIndex = true;
	    	
	    	int total = 0;
	    	for(int i=0;i<Array.length;i++){
	    		
	    		if(Array[i] > 0 && isPosIndex ){
	    			// 记录第一个正数的位置
	    			posIndex = i;    			
	    			isPosIndex =false;
	    		}
	    		
	    		// 如果为正数,则记录范围
	    		if(Array[i] > 0){
	    			range ++;
	    		}
	    		
	    		if(Array[i] < 0 ){
	    			// 遇到负数,标示终止  ,可以更新正数所存在的位置		    		
	    			isPosIndex = true;
	    			
	    			// 临时记录总数
	    			int temp = 0;
	    			
	    			// 计算之前的所有值的和,并且保存
	    			for(int j=posIndex;j<range;j++){
	    				temp += Array[j];
	    			}
	    			
	    			// 说明不是第一次就遇到负数
	    			if(temp != 0 ){
	        			// 并且大于保存的total,则保存该值
	    				if(temp > total){
	    					//beforeTotal = total;
	    					total = temp;
	    					
	    					// 保存该数组
	    					returnArray = new int[range];
	    					for(int k=posIndex;k<posIndex+returnArray.length;k++){
	    						returnArray[k-posIndex] = Array[posIndex];
	    					}
	    				}
	    			}
	    		}
	    	}
	    	
	    	
	    	return returnArray;
	    }
	    
	    public static String decodeMap(String actionInfo,
				String mallKey) throws UnsupportedEncodingException {

			// 生成随机数
			String randData = StringUtil.generalStringToAscii(8)
					+ StringUtil.generalStringToAscii(8);
			// 获取过程密钥
			String processKey = SecurityUtil.desecb(mallKey, randData,
					0);
			// 将actionInfo转换16进制后，补80
			actionInfo = SecurityUtil.padding80(SecurityUtil
					.bytesToHexString(actionInfo.getBytes("UTF-8")));
			// 将字符串编码成16进制数字,适用于所有字符（包括中文）
			actionInfo = SecurityUtil.encodeHexString(actionInfo);
			// 加密
			actionInfo = SecurityUtil.desecb(processKey, actionInfo, 0);
			// 最终生成密文
			String end = randData + actionInfo;

			return end;
		}
	    
	    


}
